import logging
import os
from logging.handlers import TimedRotatingFileHandler

from pythonjsonlogger import jsonlogger


def setup_logger(name=None, log_dir='logs'):
    # 确保日志目录存在
    if not os.path.exists(log_dir):
        os.makedirs(log_dir)

    # 使用传入的名称或默认使用模块名
    logger = logging.getLogger(name or __name__)

    # 避免重复添加处理器
    if logger.handlers:
        return logger

    logger.setLevel(logging.DEBUG)

    # 定义不同级别的日志文件
    log_levels = {
        'debug': (logging.DEBUG, 7),
        'info': (logging.INFO, 30),
        'warning': (logging.WARNING, 30),
        'error': (logging.ERROR, 90)
    }

    # 日志格式
    formatter = jsonlogger.JsonFormatter(
        fmt=
        '%(asctime)s %(levelname)s %(name)s %(lineno)d %(filename)s  %(message)s',
        datefmt='%Y-%m-%d %H:%M:%S',
        json_ensure_ascii=False)

    # 为每个级别创建处理器
    for level_name, (level, backup_count) in log_levels.items():
        file_name = os.path.join(log_dir, f'{level_name}.log')
        file_handler = TimedRotatingFileHandler(filename=file_name,
                                                when='midnight',
                                                interval=1,
                                                backupCount=backup_count,
                                                encoding='utf-8')
        file_handler.setLevel(level)
        file_handler.setFormatter(formatter)
        logger.addHandler(file_handler)

    # 添加控制台处理器
    console_handler = logging.StreamHandler()
    console_handler.setLevel(logging.INFO)

    # 控制台使用更易读的格式
    console_formatter = logging.Formatter(
        '%(asctime)s [%(levelname)s] %(name)s:%(lineno)d - %(message)s',
        datefmt='%Y-%m-%d %H:%M:%S')
    console_handler.setFormatter(console_formatter)
    logger.addHandler(console_handler)

    return logger


if __name__ == '__main__':
    logger = setup_logger()

    logger.debug("调试信息")
    logger.info("普通信息")
    logger.warning("警告信息")
    logger.error("错误信息", extra={'traceback': 'traceback信息', "a": 1})
